﻿Imports SistemaINCA.Security
Imports System.Runtime.InteropServices
Imports SistemaINCA.Models.ViewModels
Imports System.Globalization

Namespace Models

    Public Interface IAñosEscolares
        <Authorize(Roles:="ERA")> _
        Function GetAñoEscolarActivo() As String

        <Authorize(Roles:="ERA")> _
        Function GetUltimoAñoEscolar_Cerrado() As String

        <Authorize(Roles:="ERA")> _
        Function IsEditYCreacionNuevoAño() As Boolean

        <Authorize(Roles:="ERA")> _
        Function OperacionCerrarAñoEscolar(ByRef msgError) As Boolean

        <Authorize(Roles:="ERA")> _
        Function OperacionCerrarPeriodoSuficiencia(ByRef msgError) As Boolean

        '<Authorize(Roles:="ERA")> _
        'Function GetListOnlyYears() As IEnumerable(Of SelectListItem)
    End Interface

    Partial Public Class SchoolClickDB_Repositorio
        Implements IAñosEscolares

        Public ReadOnly Property IAñosEscolares() As IAñosEscolares
            Get
                Return DirectCast(Me, IAñosEscolares)
            End Get
        End Property

        Private Function GetAñoEscolarActivo() As String Implements IAñosEscolares.GetAñoEscolarActivo
            Try
                Using cnn As New SchoolClickEntities
                    Return cnn.GET_ANIO_ESCOLAR_ACTIVO(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).SingleOrDefault
                End Using
            Catch ex As Exception
                Throw New ApplicationException("Ocurrió un error inesperado la intentar recuperar el año escolar activo en el sistema.", ex)
            End Try
        End Function

        Private Function GetUltimoAñoEscolar_Cerrado() As String Implements IAñosEscolares.GetUltimoAñoEscolar_Cerrado
            Try
                Using cnn As New SchoolClickEntities
                    Return cnn.GET_LASTYEAR_CLOSE.SingleOrDefault
                End Using
            Catch ex As Exception
                Throw New ApplicationException("Ocurrió un error inesperado la intentar recuperar el ultimó año escolar activo en el sistema.", ex)
            End Try
        End Function

        Private Function IsEditYCreacionNuevoAño() As Boolean Implements IAñosEscolares.IsEditYCreacionNuevoAño
            Try
                Using cnn As New SchoolClickEntities
                    Return cnn.IS_EDIT_ANIOESCOLAR(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).SingleOrDefault
                End Using
            Catch ex As EntityException
                ex.Data.Clear()
                Return False
            End Try
        End Function

        Private Function OperacionCerrarAñoEscolar(ByRef msgError As Object) As Boolean Implements IAñosEscolares.OperacionCerrarAñoEscolar
            Dim eCompleted As Boolean = False
            Using cnn As New SchoolClickEntities
                Try
                    Dim bResult = cnn.OP_CLOSE_ANIOESCOLAR_ACTIVO(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).Single
                    If bResult Then eCompleted = True Else msgError = "Ocurrió un error inesperado al intentar cerrar año escolar activo"
                Catch ex As EntityCommandExecutionException
                    msgError = ex.InnerException.Message
                    ex.Data.Clear()
                Catch ex As Exception
                    msgError = FormatErrorMessage("Lo sentimos, ocurrió un error inesperado en el proceso.", ex.Message)
                    ex.Data.Clear()
                End Try
            End Using
            Return eCompleted
        End Function

        Private Function OperacionCerrarPeriodoSuficiencia(ByRef msgError As Object) As Boolean Implements IAñosEscolares.OperacionCerrarPeriodoSuficiencia
            Dim eCompleted As Boolean = False
            Using cnn As New SchoolClickEntities
                Try
                    Dim bResult = cnn.OP_CLOSE_PERIODO_SUFICIENCIA(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).Single
                    If bResult Then eCompleted = True Else msgError = "Ocurrió un error inesperado al intentar cerrar el periodo de reposición de materias"
                Catch ex As EntityCommandExecutionException
                    msgError = ex.InnerException.Message
                    ex.Data.Clear()
                Catch ex As Exception
                    msgError = FormatErrorMessage("Lo sentimos, ocurrió un error inesperado en el proceso.", ex.Message)
                    ex.Data.Clear()
                End Try
            End Using
            Return eCompleted
        End Function

        'Function GET_AÑO_ESCOLAR(IDInstitucion As Integer, Año_Escolar As String) As ANIOS_ESCOLARES
        '    Try
        '        Using cnn As New SchoolClickEntities
        '            Dim var = (From ae In cnn.ANIOS_ESCOLARES
        '                      Where ae.ID_INSTITUCION = IDInstitucion And ae.ID_ANIO_ESCOLAR = Año_Escolar
        '                      Select ae).SingleOrDefault

        '            If var IsNot Nothing Then
        '                Return var
        '            Else
        '                Throw New NullReferenceException("No se encontro ningun año en los registros de la institucion")
        '            End If
        '        End Using
        '    Catch ex As Exception
        '        Throw New ApplicationException("Error al intentar recuperar los años escolares del instituto", ex)
        '    End Try
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Function GET_LAST_AÑO_ESCOLAR(ID_Instituto As Integer) As String
        '    Try
        '        Using cnn As New SchoolClickEntities
        '            Dim var = (From ae In cnn.ANIOS_ESCOLARES
        '                       Where ae.ID_INSTITUCION = ID_Instituto
        '                       Select ae.ID_ANIO_ESCOLAR).Max

        '            If var IsNot Nothing Then
        '                Return var
        '            Else
        '                Return "ERROR"
        '            End If
        '        End Using
        '    Catch ex As Exception
        '        Throw New ApplicationException("Error, No se pudo determinar el ultimo año escolar de la institucion", ex)
        '    End Try
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Function GET_MIN_AÑO_ESCOLAR_BY_INSTITUTO(ID As Integer) As String
        '    Try
        '        Using cnn As New SchoolClickEntities
        '            Dim var = (From ae In cnn.ANIOS_ESCOLARES
        '                       Where ae.ID_INSTITUCION = ID
        '                       Select ae.ID_ANIO_ESCOLAR).Min

        '            If var IsNot Nothing Then
        '                Return var
        '            Else
        '                Return "ERROR"
        '            End If
        '        End Using
        '    Catch ex As Exception
        '        Throw New ApplicationException("Error, No se pudo determinar el primer año escolar de la institucion", ex)
        '    End Try
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Public Function UPDATE_ANIOESCOLARES_FECHAS(Año As Integer, FInicio As Date, FFinal As Date, ByRef msgError As String) As Boolean
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            'PRIMERO: mandamos a llamar a nuestro procedimientos almacenado para guardar los datos en la BD
        '            Dim bResult As Boolean = cnn.U_AE_FECHAS(1, _
        '                                                     EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL)) _
        '                                                     , Año, FInicio, FFinal).Single
        '            'SEGUNDO: Verificamos que le procedimiento se haya ejecutado correctamente
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, "")
        '            End If
        '        Catch ex As EntityCommandExecutionException
        '            msgError = ex.InnerException.Message
        '            ex.Data.Clear()
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Public Function INSERT_NEW_ANIOESCOLAR(Año As Integer, FInicio As Date, FFInal As Date, ByRef msgError As String) As Boolean
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            'Verificamos que no exista otro año escolar igual
        '            Dim var = (From ae In cnn.ANIOS_ESCOLARES
        '                       Where ae.ID_INSTITUCION = 1 And ae.ID_ANIO_ESCOLAR = Año
        '                       Select ae).SingleOrDefault

        '            If var IsNot Nothing Then
        '                msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, _
        '                                            String.Format("El año escolar '{0}' ya existe en la base de datos", Año.ToString))
        '                Return eCompleted
        '            End If

        '            Dim bResult As Boolean = cnn.I_AE_PROCEDURE(1, _
        '                                                        EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL)) _
        '                                                        , Año, FInicio, FFInal).Single
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, "Ocurrio un errror al intentar insertar el registro en el servidor")
        '            End If
        '        Catch ex As EntityCommandExecutionException
        '            msgError = ex.InnerException.Message
        '            ex.Data.Clear()
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Public Function GET_LISTADO_DIAS_ASUETOS(AñoE As String) As List(Of DiaAsuetoModel)
        '    Try
        '        Using cnn As New SchoolClickEntities
        '            Dim items = cnn.GET_LIST_ASUETOS_BY_ANIO(AñoE).ToList
        '            Dim lstModel = New List(Of DiaAsuetoModel)

        '            'Creamos la nueva coleccion con respecto al modeloo
        '            For Each dia In items
        '                lstModel.Add(New DiaAsuetoModel With {.IDAsueto = String.Format("{0}-{1}", dia.NUM, AñoE), _
        '                                                      .FechaInicio = dia.MINF.ToString("dd/MMM/yyyy", New CultureInfo("es-SV")), _
        '                                                      .FechaFinal = dia.MAXF.ToString("dd/MMM/yyyy", New CultureInfo("es-SV")), _
        '                                                      .Descripcion = dia.DESCRIPCION, _
        '                                                      .IsOneDay = If(dia.MINF.Equals(dia.MAXF), True, False)})
        '            Next
        '            Return lstModel
        '        End Using
        '    Catch ex As Exception
        '        Throw New ApplicationException("Ocurrio un error al intentar obtener la lista de los dias de asuetos del año escolar")
        '    End Try
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Public Function DELETE_REGISTRO_ASUETO(Año As Integer, IDRegistro As Integer, ByRef msgError As String) As Boolean
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            Dim bResult As Boolean = cnn.DEL_REGISTRO_ASUETO(IDRegistro, Año, _
        '                                                             EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL))).Single
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, "Ocurrio un errror al intentar eliminar el registro en el servidor")
        '            End If
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Public Function INSERT_REGISTRO_ASUETO(FI As Date, FF As Date, Descripcion As String, ByRef msgError As String) As Boolean
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            Dim bResult As Boolean = cnn.INS_REGISTRO_ASUETO(FI, FF, Descripcion, _
        '                                                             EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL))).Single
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, "Ocurrio un errror al intentar insertar el registro en el servidor")
        '            End If
        '        Catch ex As EntityCommandExecutionException
        '            msgError = ex.InnerException.Message
        '            ex.Data.Clear()
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function

        '<Authorize(Roles:="ERA")> _
        'Public Function UPDATE_REGISTRO_ASUETO(ID As Integer, FI As Date, FF As Date, Descripcion As String, ByRef msgError As String) As Boolean
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            Dim bResult As Boolean = cnn.UPT_REGISTRO_ASUETO(ID, FI, FF, Descripcion, _
        '                                                             EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL))).Single
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, "Ocurrio un errror al intentar actualizar el registro en el servidor")
        '            End If
        '        Catch ex As EntityCommandExecutionException
        '            msgError = ex.InnerException.Message
        '            ex.Data.Clear()
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function

        'Private Function GetListOnlyYears() As System.Collections.Generic.IEnumerable(Of System.Web.Mvc.SelectListItem) Implements IAñosEscolares.GetListOnlyYears
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            Dim var = cnn.ANIOS_ESCOLARES.OrderByDescending(Function(m) m.ID_ANIO_ESCOLAR).ToList
        '            Return var.Select(Function(m) New SelectListItem With {.Text = m.ID_ANIO_ESCOLAR, .Value = m.ID_ANIO_ESCOLAR})
        '        Catch ex As Exception
        '            Throw New ApplicationException(String.Format("Lo sentimos, no se pudo obtener el listado de años escolares del sistema. {0}", ex.Message))
        '        End Try
        '    End Using
        'End Function
    End Class
End Namespace
